home *** CD-ROM | disk | FTP | other *** search
/ Power Programmierung / Power-Programmierung (Tewi)(1994).iso / magazine / msysjour / vol06 / 03 / lanman3 / runtime.c < prev    next >
C/C++ Source or Header  |  1991-05-01  |  6KB  |  206 lines

  1. //=================================================================
  2. //  INTERFACE.C
  3. //=================================================================
  4.  
  5. #include <windows.h>
  6. #include <netcons.h>
  7. #include <neterr.h>
  8. #include <wksta.h>
  9. #include <nmpipe.h>
  10. #include <string.h>
  11. #include <mailslot.h>
  12.  
  13. #include "pbxpkt.h"
  14. #include "runtime.h"
  15.  
  16. #define MAX_MAILSLOT_NAME   255
  17. #define TIMEOUT         1000L
  18. #define OF_PIPE         (OF_READWRITE | OF_SHARE_DENY_NONE)
  19. #define ERROR_SEM_TIMEOUT   121
  20. #define MAXTRIES        5
  21.  
  22. static WORD GetMachineName(LPSTR szWkstaName);
  23.  
  24. //=================================================================
  25. //  PbxRegister() -- Registers a user with PBX.
  26. //=================================================================
  27.  
  28. WORD PbxRegister(int hPipe, LPSTR szName, WORD wClientId)
  29. {
  30.     PBXPKT packet;
  31.     WORD   err;
  32.  
  33.     packet.usPktID = REGISTER;
  34.     packet.usPktSize = sizeof(PBXPKT);
  35.     packet.usNameCnt = 1;
  36.  
  37.     packet.aPBXName[0].usClientType = wClientId;
  38.     _fstrcpy(packet.aPBXName[0].pszName, szName);
  39.  
  40.     err = _lwrite(hPipe, (LPSTR) &packet, sizeof(PBXPKT));
  41.  
  42.     return ( err <= 0 ? -1 : 0 );
  43. }
  44.  
  45. //=================================================================
  46. //  PbxConnent() -- Connects two users together.
  47. //=================================================================
  48.  
  49. WORD PbxConnect(int hPipe, LPSTR szName, WORD wClientId)
  50. {
  51.     PBXPKT packet;
  52.     WORD   err;
  53.  
  54.     packet.usPktID = CONNECT;
  55.     packet.usPktSize = sizeof(PBXPKT);
  56.     packet.usNameCnt = 1;
  57.  
  58.     packet.aPBXName[0].usClientType = wClientId;
  59.     _fstrcpy(packet.aPBXName[0].pszName, szName);
  60.  
  61.     err = _lwrite(hPipe, (LPSTR) &packet, sizeof(PBXPKT));
  62.  
  63.     return ( err <= 0 ? -1 : 0 );
  64. }
  65.  
  66. //=================================================================
  67. //  PbxSearch() -- Searches for a PBX and returns its name.
  68. //=================================================================
  69.  
  70. WORD PbxSearch(LPSTR szPbxName)
  71. {
  72.     WORD hMailSlot, wBytes = 0, err;
  73.     WORD wNextSize = 0, wNextPriority = 0;
  74.     char szMailSlot[MAX_MAILSLOT_NAME];
  75.     char szWkstaName[UNCLEN+1] = "\\\\";
  76.     WORD nMaxTries = MAXTRIES;
  77.  
  78.     //=============================================
  79.     //    First make the mailslot
  80.     //=============================================
  81.  
  82.     if ( err = DosMakeMailslot(ANNOUNCELINE, UNCLEN+1,
  83.                 UNCLEN+1, &hMailSlot) )
  84.     {
  85.     return err;
  86.     }
  87.  
  88.     strcpy(szMailSlot, "\\\\*");
  89.     strcat(szMailSlot, ANNOUNCELINE);
  90.     GetMachineName(&szWkstaName[2]);
  91.  
  92.     //=============================================
  93.     //    Write to the mailslot the machine name
  94.     //=============================================
  95.  
  96.     if ( err = DosWriteMailslot(szMailSlot, szWkstaName,
  97.                  strlen(szWkstaName),
  98.                  ANNOUNCEPRIORITY, 2, 0) )
  99.  
  100.     {
  101.     DosDeleteMailslot(hMailSlot);
  102.     return err;
  103.     }
  104.  
  105.     //=============================================
  106.     //    Read the mailslot for the reply.
  107.     //    We have to read more than once because
  108.     //    we can receive our own broadcast. We will
  109.     //    read upto MAXTRIES times before reporting
  110.     //    timeout.
  111.     //=============================================
  112.  
  113.     do {
  114.     err = DosReadMailslot(hMailSlot, szPbxName,
  115.                   &wBytes, &wNextSize,
  116.                   &wNextPriority, TIMEOUT);
  117.  
  118.     //============================================
  119.     //  We have received the reply but we do
  120.     //  not know if it is from PBX or if it is
  121.     //  our broadcast.
  122.     //============================================
  123.  
  124.     if ( !err && _fstrcmp(szPbxName, szWkstaName) == 0 )
  125.     {
  126.         err = -1;        //... it was our broadcast
  127.     }
  128.     }
  129.     while(err && --nMaxTries);
  130.  
  131.     DosDeleteMailslot(hMailSlot);
  132.  
  133.     if ( err && nMaxTries == 0 )    //... ignore err and report
  134.     {                    //... timeout condition
  135.     return ERROR_SEM_TIMEOUT;
  136.     }
  137.  
  138.     return err;
  139. }
  140.  
  141. //=================================================================
  142. //  OpenPIpe() -- Opens the pipe
  143. //=================================================================
  144.  
  145. WORD OpenPipe(int *phPipe, LPSTR szPipeName)
  146. {
  147.     OFSTRUCT of;
  148.     WORD     hPipe;
  149.  
  150.     *phPipe = OpenFile(szPipeName, &of, OF_PIPE);
  151.  
  152.     return (*phPipe == -1 ? of.nErrCode : 0);
  153. }
  154.  
  155. //=================================================================
  156. //  PeekPIpe() -- Retrieves the contents of a pipe without removing
  157. //  it.
  158. //=================================================================
  159.  
  160. WORD PeekPipe(int hPipe, LPVOID buf, WORD nBytes,
  161.           LPWORD nBytesRead, LPWORD nAvail)
  162. {
  163.     AVAILDATA  avail;
  164.     WORD       wPipeState, err;
  165.  
  166.     err = DosPeekNmPipe(hPipe, buf, nBytes, nBytesRead,
  167.             (PAVAILDATA) &avail, (LPWORD) &wPipeState);
  168.  
  169.     *nAvail = avail.cbpipe;
  170.  
  171.     return err;
  172. }
  173.  
  174. //=================================================================
  175. //  GetMachineName -- Retrieves the local computer name.
  176. //=================================================================
  177.  
  178. static WORD GetMachineName(LPSTR szWkstaName)
  179. {
  180.     HANDLE hWksta;
  181.     struct wksta_info_0 far *wksta = NULL;
  182.     unsigned rc, total;
  183.  
  184.     //... This first call will fail, but it will return the
  185.     //... actual number of bytes needed to complete the call.
  186.  
  187.     rc = NetWkstaGetInfo(NULL, 0, (LPVOID) wksta, 0, &total);
  188.  
  189.     if ( rc == ERROR_MORE_DATA || rc == NERR_BufTooSmall)
  190.     {
  191.     hWksta = GlobalAlloc(GMEM_MOVEABLE, total);
  192.     wksta = (LPVOID) GlobalLock(hWksta);
  193.  
  194.     rc = NetWkstaGetInfo(NULL, 0, (LPVOID) wksta, total, &total);
  195.  
  196.     if ( rc == NERR_Success )
  197.     {
  198.         _fstrcpy((LPSTR) szWkstaName, wksta->wki0_computername);
  199.     }
  200.  
  201.     GlobalFree(hWksta);
  202.     }
  203.  
  204.     return rc;
  205. }
  206.